home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
MACD 5
/
MACD 5.bin
/
workbench
/
tools
/
czesc_4
/
wisecrack
/
wisecrack.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-23
|
8KB
|
306 lines
/***********************************************************************
WiseCrack - A fortune cookie program using Nico Françios
ReqTools library for simplicity.
Version 1.0 by Lars Magnus Nordeide.
This program is written using SAS/C V5.10a.
(See SASCOPTS for the compiler options.)
***********************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dos.h>
#include <math.h>
#include <libraries/dos.h>
#include <workbench/startup.h>
#include <workbench/workbench.h>
#include <libraries/reqtools.h>
#include <proto/reqtools.h>
#include <proto/icon.h>
/*
* Global variables.
*/
struct ReqToolsBase *ReqToolsBase = NULL;
struct Library *IconBase = NULL;
BOOL window = FALSE, fromwb;
char *filepath, *wisetext;
/*
* Prototypes.
*/
void PrintHelp(char *), CleanExit(char *, int), ReadText(char *, char *);
void main(int argc, char **argv)
{
int next = 1;
char option, *odata, *tooltype, **toolarray;
char *opts = "f";
FILE *fpout;
struct TagItem reqtags[] = { RTEZ_ReqTitle, (ULONG)"WiseCrack V1.0",
TAG_END };
struct WBStartup *wbenchmsg;
struct WBArg *wbarg;
struct DiskObject *dobj;
/*
* Allocate space for filepath and assign default datafile name.
*/
filepath = (char *)malloc(FMSIZE);
if (!filepath)
CleanExit("Cannot allocate space.", RETURN_FAIL);
strcpy(filepath, "S:WiseCrack.dat");
/*
* Allocate space for the text. 2400 bytes should be more than
* enough. This corresponds to a window with size 80x30 characters,
* full of text.
*/
wisetext = (char *)malloc(2400);
if (!wisetext)
CleanExit("Cannot allocate space.", RETURN_FAIL);
/*
* Are we started from the workbench?
*/
fromwb = window = (argc == 0);
if (!fromwb) { /* Program was started from CLI, parse arguments */
while ((odata = argopt(argc, argv, opts, &next, &option))
!= NULL) {
switch(option) {
case 'h':
case '?':
PrintHelp(argv[0]);
break;
case 'w':
window = TRUE;
break;
default:
CleanExit("Illegal option!", RETURN_ERROR);
break;
}
}
if (next < argc) {
if (argv[next][0] == '?')
PrintHelp(argv[0]);
else
strcpy(filepath, argv[next]);
}
}
else { /* Started from the workbench */
wbenchmsg = (struct WBStartup *)argv;
/*
* Get the arguments for this tool.
*/
wbarg = wbenchmsg->sm_ArgList;
/*
* Open icon.library.
*/
IconBase =(struct Library *) OpenLibrary("icon.library", 33);
if (!IconBase)
CleanExit("Cannot open icon.library.", RETURN_FAIL);
/*
* Read the iconfile.
*/
dobj = GetDiskObject(wbarg->wa_Name);
if (!dobj)
CleanExit("Cannot open icon.", RETURN_FAIL);
/*
* Get the filename if given.
*/
toolarray = (char **)dobj->do_ToolTypes;
tooltype = FindToolType(toolarray, "DATAFILE");
if(tooltype && tooltype[0] != '\0')
strcpy(filepath, tooltype);
/*
* Free the DiskObject.
*/
FreeDiskObject(dobj);
/*
* Close The icon library.
*/
if (IconBase)
CloseLibrary((struct Library *)IconBase);
}
/*
* Read text to print.
*/
ReadText(filepath, wisetext);
/*
* Print out text, either to the console or in a separate window.
*/
if (window) {
/*
* Open ReqTool library.
*/
ReqToolsBase = (struct ReqToolsBase *)
OpenLibrary(REQTOOLSNAME, REQTOOLSVERSION);
if (!ReqToolsBase)
CleanExit("Cannot open reqtools.library", RETURN_FAIL);
rtEZRequestA(wisetext, "OK", NULL, NULL, reqtags);
}
else {
/*
* Open stdout.
*/
fpout = fopen("*", "w");
fprintf(fpout, "%s\n", wisetext);
close(fpout);
}
/*
* Ok, we are finished.
*/
CleanExit(NULL, RETURN_OK);
}
/***********************************************************************/
void ReadText(char *filepath, char *text)
{
struct FILEINFO *info;
int cnt = 0;
char ch;
long size, pos;
unsigned int clock[2];
unsigned short seed[3];
FILE *infile;
/*
* Initialize stuff.
*/
info = (struct FILEINFO *)malloc(sizeof(struct FILEINFO));
if (!info)
CleanExit("Cannot allocate space.", RETURN_FAIL);
/*
* Check if datafile exist in specified filepath.
*/
if (dfind(info, filepath, 0)) {
sprintf(text, "Cannot find file %s", filepath);
return;
}
/*
* Find the size of the file in bytes.
*/
size = info->fib_Size;
/*
* Have no more use for info. Free it.
*/
free(info);
/*
* Compute a random position in the file.
*/
timer(clock);
seed[0] = clock[0];
seed[1] = clock[1];
seed[2] = clock[0];
pos = nrand48(seed) % size;
/*
* Open file.
*/
infile = fopen(filepath, "r");
if (infile == NULL) {
sprintf(text, "Cannot open %s.", filepath);
return;
}
/*
* Fast forward to computed position.
*/
fseek(infile, pos, 0);
/*
* Find next start of text to print out.
*/
while(((ch = fgetc(infile)) != '\\') && (ch != EOF));
/*
* Sometimes we are unlucky and will read past the end of the file.
* Instead of trying again, it's easier just to use a standard text.
* It's okay as it won't happen to often.
*/
if (ch == EOF) {
strcpy(text,"How many IBM PC's does it take to execute a job?\n");
strcat(text,"Four. Three to hold it down, and one to rip it's");
strcat(text," head of.\n");
}
else {
/*
* Read text until the next '\' or EOF.
*/
while(((ch = fgetc(infile)) != '\\') && (ch != EOF)) {
text[cnt] = ch;
cnt++;
}
text[cnt-1] = '\0';
}
/*
* Close the file because we are done.
*/
fclose(infile);
}
/***********************************************************************/
void PrintHelp(char *name)
{
FILE *fpout;
fpout = fopen("*", "w");
fprintf(fpout, "WiseCrack V1.0 by Lars Magnus Nordeide\n");
fprintf(fpout, "Usage: %s [-w] [filename]\n", name);
fclose(fpout);
CleanExit(NULL, RETURN_OK);
}
/***********************************************************************/
void CleanExit(char *message, int ret_val)
{
FILE *fpout;
/*
* Close the opened libraries.
*/
if (ReqToolsBase)
CloseLibrary((struct Library *)ReqToolsBase);
/*
* Free the space allocated for the filename.
*/
if (wisetext)
free(wisetext);
if (filepath)
free(filepath);
/*
* If there is an error then print the error message.
*/
if (message && !fromwb) {
fpout = fopen("*", "w");
fprintf(fpout, "WiseCrack: %s\n", message);
fclose(fpout);
}
exit(ret_val);
}